package com.beta.cust.bind.datasync.dto;

import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * 获取部门成员详情<br>
 * 详情见：https://work.weixin.qq.com/api/doc/90000/90135/90201<br>
 */

@NoArgsConstructor
@Data
public class PersonnelDTO {

    /**
     * 返回码
     */
    @JSONField(name = "errcode")
    private Integer errcode;

    /**
     * 对返回码的文本描述内容
     */
    @JSONField(name = "errmsg")
    private String errmsg;

    /**
     * 成员列表
     */
    @JSONField(name = "userlist")
    private List<UserlistDTO> userlist;


    /**
     * 成员列表
     */
    @NoArgsConstructor
    @Data
    public static class UserlistDTO {

        /**
         * 成员UserID。对应管理端的帐号
         */
        @JSONField(name = "userid")
        private String userid;

        /**
         * 成员名称；第三方不可获取，调用时返回userid以代替name；代开发自建应用需要管理员授权才返回；对于非第三方创建的成员，第三方通讯录应用也不可获取；未返回名称的情况需要通过通讯录展示组件来展示名字
         */
        @JSONField(name = "name")
        private String name;

        /**
         * 成员所属部门id列表，仅返回该应用有查看权限的部门id
         */
        @JSONField(name = "department")
        private List<Long> department;

        /**
         * 部门内的排序值，默认为0。数量必须和department一致，数值越大排序越前面。值范围是[0, 2^32)
         */
        @JSONField(name = "order")
        private List<Long> order;

        /**
         * 职务信息；代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
         */
        @JSONField(name = "position")
        private String position;

        /**
         * 手机号码，代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
         */
        @JSONField(name = "mobile")
        private String mobile;

        /**
         * 性别。0表示未定义，1表示男性，2表示女性
         */
        @JSONField(name = "gender")
        private String gender;

        /**
         * 邮箱，代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
         */
        @JSONField(name = "email")
        private String email;

        /**
         * 表示在所在的部门内是否为上级。0-否；1-是。是一个列表，数量必须与department一致。第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
         */
        @JSONField(name = "is_leader_in_dept")
        private List<Integer> isLeaderInDept;

        /**
         * 头像url。 第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
         */
        @JSONField(name = "avatar")
        private String avatar;

        /**
         * 头像缩略图url。第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
         */
        @JSONField(name = "thumb_avatar")
        private String thumbAvatar;

        /**
         * 座机。代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
         */
        @JSONField(name = "telephone")
        private String telephone;

        /**
         * 别名；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
         */
        @JSONField(name = "alias")
        private String alias;

        /**
         * 激活状态: 1=已激活，2=已禁用，4=未激活，5=退出企业。
         * 已激活代表已激活企业微信或已关注微工作台（原企业号）。未激活代表既未激活企业微信又未关注微工作台（原企业号）。
         */
        @JSONField(name = "status")
        private Integer status;

        /**
         * 地址。代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
         */
        @JSONField(name = "address")
        private String address;

        /**
         * 企业微信官方未说明该字段的意思
         */
        @JSONField(name = "hide_mobile")
        private Integer hideMobile;

        /**
         * 企业微信官方未说明该字段的意思
         */
        @JSONField(name = "english_name")
        private String englishName;

        /**
         * 全局唯一。对于同一个服务商，不同应用获取到企业内同一个成员的open_userid是相同的，最多64个字节。仅第三方应用可获取
         */
        @JSONField(name = "open_userid")
        private String openUserid;

        /**
         * 主部门
         */
        @JSONField(name = "main_department")
        private Long mainDepartment;

        /**
         * 扩展属性，代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
         */
        @JSONField(name = "extattr")
        private ExtattrDTO extattr;

        /**
         * 员工个人二维码，扫描可添加为外部联系人(注意返回的是一个url，可在浏览器上打开该url以展示二维码)；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
         */
        @JSONField(name = "qr_code")
        private String qrCode;

        /**
         * 对外职务，如果设置了该值，则以此作为对外展示的职务，否则以position来展示。代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
         */
        @JSONField(name = "external_position")
        private String externalPosition;

        /**
         * 成员对外属性，字段详情见对外属性；代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
         */
        @JSONField(name = "external_profile")
        private ExternalProfileDTO externalProfile;


        /**
         * 扩展属性，代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
         */
        @NoArgsConstructor
        @Data
        public static class ExtattrDTO {

            /**
             * 企业微信官方未说明该字段的意思
             */
            @JSONField(name = "attrs")
            private List<AttrsDTO> attrs;


            /**
             * 企业微信官方未说明该字段的意思
             */
            @NoArgsConstructor
            @Data
            public static class AttrsDTO {

                /**
                 * 企业微信官方未说明该字段的意思
                 */
                @JSONField(name = "type")
                private Integer type;

                /**
                 * 企业微信官方未说明该字段的意思
                 */
                @JSONField(name = "name")
                private String name;

                /**
                 * 企业微信官方未说明该字段的意思
                 */
                @JSONField(name = "text")
                private TextDTO text;

                /**
                 * 企业微信官方未说明该字段的意思
                 */
                @JSONField(name = "web")
                private WebDTO web;


                /**
                 * 企业微信官方未说明该字段的意思
                 */
                @NoArgsConstructor
                @Data
                public static class TextDTO {

                    /**
                     * 企业微信官方未说明该字段的意思
                     */
                    @JSONField(name = "value")
                    private String value;
                }


                /**
                 * 企业微信官方未说明该字段的意思
                 */
                @NoArgsConstructor
                @Data
                public static class WebDTO {

                    /**
                     * 企业微信官方未说明该字段的意思
                     */
                    @JSONField(name = "url")
                    private String url;

                    /**
                     * 企业微信官方未说明该字段的意思
                     */
                    @JSONField(name = "title")
                    private String title;

                }
            }
        }


        /**
         * 成员对外属性，字段详情见对外属性；代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
         */
        @NoArgsConstructor
        @Data
        public static class ExternalProfileDTO {

            /**
             * 企业微信官方未说明该字段的意思
             */
            @JSONField(name = "external_corp_name")
            private String externalCorpName;

            /**
             * 企业微信官方未说明该字段的意思
             */
            @JSONField(name = "wechat_channels")
            private WechatChannelsDTO wechatChannels;

            /**
             * 企业微信官方未说明该字段的意思
             */
            @JSONField(name = "external_attr")
            private List<ExternalAttrDTO> externalAttr;


            /**
             * 企业微信官方未说明该字段的意思
             */
            @NoArgsConstructor
            @Data
            public static class WechatChannelsDTO {

                /**
                 * 企业微信官方未说明该字段的意思
                 */
                @JSONField(name = "nickname")
                private String nickname;

                /**
                 * 企业微信官方未说明该字段的意思
                 */
                @JSONField(name = "status")
                private Integer status;
            }


            /**
             * 企业微信官方未说明该字段的意思
             */
            @NoArgsConstructor
            @Data
            public static class ExternalAttrDTO {

                /**
                 * 企业微信官方未说明该字段的意思
                 */
                @JSONField(name = "type")
                private Integer type;

                /**
                 * 企业微信官方未说明该字段的意思
                 */
                @JSONField(name = "name")
                private String name;

                /**
                 * 企业微信官方未说明该字段的意思
                 */
                @JSONField(name = "text")
                private TextDTO text;

                /**
                 * 企业微信官方未说明该字段的意思
                 */
                @JSONField(name = "web")
                private WebDTO web;

                /**
                 * 企业微信官方未说明该字段的意思
                 */
                @JSONField(name = "miniprogram")
                private MiniprogramDTO miniprogram;


                /**
                 * 企业微信官方未说明该字段的意思
                 */
                @NoArgsConstructor
                @Data
                public static class TextDTO {

                    /**
                     * 企业微信官方未说明该字段的意思
                     */
                    @JSONField(name = "value")
                    private String value;
                }


                /**
                 * 企业微信官方未说明该字段的意思
                 */
                @NoArgsConstructor
                @Data
                public static class WebDTO {

                    /**
                     * 企业微信官方未说明该字段的意思
                     */
                    @JSONField(name = "url")
                    private String url;

                    /**
                     * 企业微信官方未说明该字段的意思
                     */
                    @JSONField(name = "title")
                    private String title;

                }


                /**
                 * 企业微信官方未说明该字段的意思
                 */
                @NoArgsConstructor
                @Data
                public static class MiniprogramDTO {

                    /**
                     * 企业微信官方未说明该字段的意思
                     */
                    @JSONField(name = "appid")
                    private String appid;

                    /**
                     * 企业微信官方未说明该字段的意思
                     */
                    @JSONField(name = "pagepath")
                    private String pagepath;

                    /**
                     * 企业微信官方未说明该字段的意思
                     */
                    @JSONField(name = "title")
                    private String title;
                }
            }
        }
    }
}
